#pragma once

#include <gexpl_usart.h>

// 设置给定USART的波特率，要求波特率为偶数。
static inline void usart_set_baud_rate(usart_qe usart_q, u32_s baud_rate,
				       u32_s apbx_freq) {
	u16_s reg_value = (apbx_freq + (baud_rate >> 1)) / baud_rate;
	usart_wreg(usart_q, USART_BAUD_R, reg_value);
}

// 字长为8位且无校验位的情况下，以非阻塞方式向USART写1字节数据。
static inline void usart_wn_byte(usart_qe usart_q, u8_s byte) {
	usart_wreg(usart_q, USART_DATA_R, byte);
}

// 字长为8位且无校验位的情况下，以非阻塞方式从USART读1字节数据，返回值仅低8位有效。
static inline u32_s usart_rn_byte(usart_qe usart_q) {
	return usart_rreg(usart_q, USART_DATA_R);
}

void usart_wait_stat(usart_qe usart_q, usart_stat_expl_s stat_wait);

// 字长为8位且无校验位的情况下，以阻塞方式向USART写1字节数据。
static inline void usart_wb_byte(usart_qe usart_q, u8_s byte) {
	usart_stat_expl_s stat_trans_avl = {
		.trans_avl = 1,
	};
	usart_wait_stat(usart_q, stat_trans_avl);
	usart_wn_byte(usart_q, byte);
}

// 字长为8位且无校验位的情况下，以阻塞方式从USART读1字节数据，返回值仅低8位有效。
static inline u32_s usart_rb_byte(usart_qe usart_q) {
	usart_stat_expl_s stat_has_unread = {
		.has_unread = 1,
	};
	usart_wait_stat(usart_q, stat_has_unread);
	return usart_rn_byte(usart_q);
}

// 获取给定USART的DATA寄存器的地址（uint32型），以便于DMA使用。
static inline u32_s usart_get_data_q(usart_qe usart_q) {
	return usart_get_reg_q(usart_q, USART_DATA_R);
}
